
package com.eva.android;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;

import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.cropimage.CropImage;
import com.x52im.rbchat.R;
import com.x52im.rbchat.permission2.PermissionManager;

import java.util.Observable;
import java.util.Observer;

/**
 * 一个提供了图片相关操作的辅助实现类.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class PictureHelper
{
	private final static String TAG = PictureHelper.class.getSimpleName();
	
	/**
	 * 裁切图片.
	 * <p>
	 * <b>注意：</b>本方法将进入新的Activity，调用者需要处理requestCode表示的回调，
	 * 回调时通常情况下srcUri指向的即是裁切完成的图片Uri.
	 * <p>
	 * 当前的裁剪实现是对指定的图片进行裁剪后保存复盖之，所以如果想不影响愿意图，则在
	 * 裁剪前应该复制一份后再对复制的图进行裁剪哦。
	 * 
	 * @param srcUri 此Uri非关键参数，它只是用于CropImage判断Uri的MIME类型用的，也许此参数以后可以去掉（尚待确认）
	 * @param srcPath 要裁切的真实图片绝对路径
	 * @param outputX
	 * @param outputY
	 * @param requestCode
	 */
	public static void cropImageUri(Activity activity, Uri srcUri
			, String srcPath, int outputX, int outputY, int requestCode)
	{
		if(srcUri == null || srcPath == null)
		{
//			WidgetUtils.showToast(parentActivity, HINT_FOR_SDCARD_ERROR, ToastType.WARN);
			Log.e(TAG, "srcUri or srcPath is null!");
			return;
		}

		//			Intent intent = new Intent("com.android.camera.action.CROP");
		Intent intent = new Intent(activity, CropImage.class);
		intent.setDataAndType(srcUri, "image/*");
		intent.putExtra("crop", "true");
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", outputX);
		intent.putExtra("outputY", outputY);
		intent.putExtra("scale", true);
//		intent.putExtra("image-path", srcUri);
		intent.putExtra("image-path", srcPath);
//		//intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
		intent.putExtra("return-data", false);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection", true); // no face detection
		activity.startActivityForResult(intent, requestCode);
	}
	
	/**
	 * 从相册中选取（仅实现图片选择没有实现裁切哦）.
	 *
	 * <p>
	 * 补充：本方法适合需要对原图进行文件级读取和处理，包括复制、及复制后的裁剪、压缩等场景下，比如用户头像上传、照片上传等场景）。
	 *
	 * <p>
	 * <b>注意：</b>本方法将进入新的Activity，调用者需要处理requestCode表示的回调，
	 * 回调时uriToBeSave指向的即是你需的的图片Uri.
	 *
	 * <p>
	 * 【动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）】：
	 * 本方法需要从相册中获取图片，所以需要动态申请 "android.permission.WRITE_EXTERNAL_STORAGE"、
	 * "android.permission.READ_EXTERNAL_STORAGE"权限。在RainbowChat中，因启动就进行了存储权限
	 * 的申请，所以本方法中不需要单独再处理了！如果您是复制本方法到别的地方使用，请不要忘记申请权限！
	 * 
	 * @param activity 调用选择图片的父类Activity
	 * @param requestCode 用于选择图片完成时的回调处理
	 * @since 1.0
	 */
	public static void choosePhoto2(Activity activity, int requestCode)
	{
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");//intent.setType("video/*;image/*");
//		intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
		activity.startActivityForResult(intent, requestCode);
	}

	/**
	 * 从相册中选取（只读）。
	 *
	 * <p>
	 * 补充：本方法适合直从返回的Uri中读取Bitmap对象，无需对原图进行任何处理：包括裁剪、压缩等场景下，比如2维码识别场景。
	 *
	 * <p>
	 * 【动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）】：
	 * 本方法需要从相册中获取图片，所以需要动态申请 "android.permission.WRITE_EXTERNAL_STORAGE"、
	 * "android.permission.READ_EXTERNAL_STORAGE"权限。在RainbowChat中，因启动就进行了存储权限
	 * 的申请，所以本方法中不需要单独再处理了！如果您是复制本方法到别的地方使用，请不要忘记申请权限！
	 *
	 * @param activity 调用选择图片的父类Activity
	 * @param requestCode 用于选择图片完成时的回调处理
	 * @since 8.0
	 */
	public static void choosePhoto3(Activity activity, int requestCode)
	{
		Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
		activity.startActivityForResult(pickIntent, requestCode);
	}

//	/**
//	 * 利用Android系统提供的从相册中选取图片并由系统提供的功能进行裁切并保存结果.
//	 *
//	 * @param activity 调用选择图片的父类Activity
//	 * @param requestCode 用于选择图片完成时的回调处理
//	 * @param uriToBeSave 选择图片后，此参数即是指向所选择图片Uri
//	 * @param avatar_size 图像保存大小
//	 */
//	// 说明：本方法自2014-01-03日已停用，原因如下：
//	//      2014-01-02日在Android3.0平台上测试从相册选册时没有问题（这么简单当然没有问题），但是貌似系统自已
//	//		提供的裁切功能不能正常使用（经常卡死，原因不明），估计又是Android奇葩的不同厂商兼容性问题，干脆裁切
//	//		就使用自行实现（其实是来自开源）裁切功能而再也不利用系统功能了（目前裁切利用跟拍照一样的原理实现！）
//	@Deprecated
//	public static void choosePhoto(Activity activity, int requestCode, Uri uriToBeSave, int avatar_size)
//	{
//		if(uriToBeSave == null)
//		{
//			Log.e(TAG, "uriToBeSave is null!");
//			return;
//		}
//
//		Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
//		intent.setType("image/*");
//		intent.putExtra("crop", "true");
//		intent.putExtra("aspectX", 1);
//		intent.putExtra("aspectY", 1);
//		intent.putExtra("outputX", avatar_size);
//		intent.putExtra("outputY", avatar_size);
//		intent.putExtra("scale", true);
//		intent.putExtra("return-data", false);
//		intent.putExtra(MediaStore.EXTRA_OUTPUT, uriToBeSave); // 保存到的目标位置
//		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
//		intent.putExtra("noFaceDetection", false); // no face detection
//		activity.startActivityForResult(intent, requestCode);//CHOOSE_BIG_PICTURE);
//	}
	
	/**
	 * 拍照.
	 * <p>
	 * <b>注意：</b>本方法将进入新的Activity，调用者需要处理requestCode表示的回调，
	 * 回调时uriToBeSave指向的即是你需的的图片Uri.
	 *
	 * <p>
	 * 【动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）】：
	 * 本方法需要拍照（调用相机），所以需要动态申请 "android.permission.CAMERA"权限。
	 * 
	 * @param activity 调用拍照的父类Activity
	 * @param requestCode 用于拍照完成时的回调处理
	 * @param uriToBeSave 拍照完成后，此参数即是指向所拍照片Uri
	 */
	public static void takePhoto(final Activity activity, final int requestCode, final Uri uriToBeSave )
	{
		if(uriToBeSave == null)
		{
			Log.e(TAG, "uriToBeSave is null!");
			return;
		}

		// 开始动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）
		PermissionManager.requestPermission_CARMERA(activity
				// 权限获取成功或已经取得此权限时
				, new Observer(){
					@Override
					public void update(Observable o, Object arg) {

						//** 权限正常获取，走正常的代码逻辑

						try{
							// capture a big bitmap and store it in Uri
							Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is capture
							// ACTION_IMAGE_CAPTURE只能支持的属性是EXTRA_OUTPUT
//							intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
							intent.putExtra(MediaStore.EXTRA_OUTPUT, uriToBeSave);

							// 添加这一句表示对目标应用临时授权该Uri所代表的文件（Android 7.0及以上版本必须！）
							intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
									| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

							activity.startActivityForResult(intent, requestCode);
						}
						catch (Exception e) {
							Log.w(TAG, e);
							try {
								WidgetUtils.showWithDialog(activity, activity.getString(R.string.general_error), "您的系统不支持拍照预览！");
							} catch (Exception ee) {
								Log.w(TAG, ee);
							}
						}
					}
				}
				, null);
	}

}
